package rpg.narrativa;

import java.util.ArrayList;
import javax.swing.JOptionPane;
import rpg.cenario.Lugar;
import rpg.personagem.Amigo;
import rpg.personagem.Inimigo;
import rpg.personagem.Mensageiro;
import rpg.personagem.Personagem;

/**
 * Estacao
 *
 * @author Gabriel Bronzatti Moro
 * @since 08/01/2013
 * @version 0.3
 */
public class Estacao {

    /**
     * paradaCenario pergunta o qual ação o mensageiro quer realizar ele é
     * repetido até o mensageiro escolher seguir em frente
     */
    public void paradaCenario(int opcoes, Lugar atual, Mensageiro mensageiro) {
        int cont = 0;
        int dormida = 0;
        while (cont >= 0) {
            switch (opcoes) {
                case 1:
                    //Mensageiro escolheu seguir em frente
                    mensageiro.atualizarVida(-10);
                    cont = -1;
                    break;
                case 2:
                    //Mensageiro ver inventario
                    //LIBERAR PANE DO DOUGLAS
                    paradaVerificarInventario(mensageiro, opcoes);
                    cont++;
                    break;
                case 3:
                    //PEDRO DEVE PEGAR AS INFORMAÇÔES DESSE RETORNO
                    paradaStatus(mensageiro);
                    cont++;
                    break;
                case 4:
                    //Mensageiro escolheu dormir um pouco
                    if (dormida > 1) {
                        JOptionPane.showMessageDialog(null, "Você já dormiu 3 vezes, já deu por favor.Agora você está proibido de dormir pela legislação vigente!!!", "Alerta à Usuário...", JOptionPane.INFORMATION_MESSAGE);
                    } else {
                        mensageiro.dormir();
                        dormida++;
                    }
                    cont++;
                    break;
                case 5:
                    //Mensageiro escolheu procurar recurso 
                    //LIBERA O PANE DO DOUGLAS
                    paradaVerificarInventario(mensageiro, opcoes);
                    cont++;
                default:
                    //this.entrada.entradaInválida();
                    break;
            }
        }
    }

    /**
     * paradaStatus Método responsável por recuperar o estado do mensageiro...
     * como: nome, pontos de vida, pontos de ataque, pontos de defesa, pontos de
     * velocidade...
     */
    public ArrayList<String> paradaStatus(Mensageiro mensageiro) {
        ArrayList<String> statusMensageiro = new ArrayList<>();
        statusMensageiro.add("Nome: " + mensageiro.getNome());
        statusMensageiro.add("Vida: " + mensageiro.getVida());
        statusMensageiro.add("Ataque Total: " + mensageiro.getAtaqueTotal());
        statusMensageiro.add("Defesa Total: " + mensageiro.getDefesaTotal());
        statusMensageiro.add("Velocidade Total: " + mensageiro.getVelocidadeTotal());
        return statusMensageiro;
    }

    /**
     * Método responsável por realizar a interação do mensageiro para com o
     * amigo Se o mensageiro não escutar o amigo ele perde 10 de vida se escutar
     * ele ganha experiencia
     *
     */
    public boolean paradaAmigo(int resposta, Lugar atual, Mensageiro mensageiro) {
        if (resposta == 1) {
            if (atual.getPersonagem() instanceof Amigo) {
                Amigo amigo = (Amigo) atual.getPersonagem();
                System.out.println(amigo.getDica());
                mensageiro.ganharExperiencia(amigo);
                return true;
            }
        }
        if (resposta == 2) {
            mensageiro.atualizarVida(-10);
            return false;
        }
        return false;
    }

    /**
     * Recebe os lugares que possuem confronto com inimigo para processar o
     * confronto
     *
     * @param atualLugar
     */
    public void paradaConfronto(Lugar atualLugar, Mensageiro mensageiro, int resposta) {
        if (atualLugar.getPersonagem() instanceof Inimigo) {
            if (resposta == 1) {
                boolean venceu = atualLugar.getDesafio().Confronto(atualLugar.getPersonagem(), resposta, mensageiro.getAtaqueTotal(), atualLugar.getPersonagem().getAtaqueTotal());
                if (venceu == true) {
                    mensageiro.ganharExperiencia(atualLugar.getPersonagem());
                    morteDoPersonagem(atualLugar.getPersonagem());
                } else {
                    morteDoPersonagem(mensageiro);
                }
            }
            if (resposta == 2) {
                mensageiro.fugirCombate(23);
            }
        }
    }

    /**
     * Método Responsável por Informar setar o status de vida do mensageiro
     * recebido como parametro e informar a morte do mesmo e encerra o jogo
     */
    public void morteDoPersonagem(Mensageiro mensageiro) {
        mensageiro.setTotal(0, 0, 0, 0);
        JOptionPane.showMessageDialog(null, "Mensageiro: " + mensageiro.getNome() + "..Você morreu..." + "Game Over!!!", "Alerta à usuário", JOptionPane.ERROR_MESSAGE);
        System.exit(0);
    }

    /**
     * Método Responsável por Informar setar o status de vida do inimigo
     * recebido como parametro e informar a morte do mesmo
     */
    public void morteDoPersonagem(Personagem inimigo) {
        if (inimigo instanceof Inimigo) {
            inimigo.setTotal(0, 0, 0, 0);
            JOptionPane.showMessageDialog(null, "Inimigo: " + inimigo.getNome() + "..está morto...", "Alerta à usuário", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    /**
     * Método responsável por verificar se o local atual já está no histórico
     * dos locais percorridos para retorná-lo caso for igual
     *
     * @param position
     * @param percorridos
     * @param atual
     * @return
     */
    public Lugar verificaLugarJaPercorrido(int position, ArrayList<Lugar> percorridos, Lugar atual) {
        if (percorridos.get(position) == atual) {
            return percorridos.get(position);
        }
        for (int x = 0; x < percorridos.size(); x++) {
            if (percorridos.get(x) == atual) {
                return atual;
            }
        }
        return atual;
    }

    /**
     * Método responsável por verificar os recursos do mensageiro e receber o numero 
     * de qual o mesmo quer utilizar
     */
    public void paradaVerificarInventario(Mensageiro mensageiro, int numeroDoRecurso) {
        try{
        if (!mensageiro.getRecursos().isEmpty()) {
         if (numeroDoRecurso< mensageiro.getRecursos().size()) {
             mensageiro.usarItem(mensageiro.getRecursos().get(numeroDoRecurso));
            }
        }else{
            throw new ArrayIndexOutOfBoundsException();
        }
        }catch(ArrayIndexOutOfBoundsException erro){
            JOptionPane.showMessageDialog(null,"Você está sem recursos: "+ erro.getMessage());
        }
    }
}